home *** CD-ROM | disk | FTP | other *** search
- #!/bin/bash
- # -*- Mode: Sh -*-
- # lcf ---
- # Author : Manoj Srivastava ( srivasta@glaurung.green-gryphon.com )
- # Created On : Mon Feb 25 12:04:52 2002
- # Created On Node : glaurung.green-gryphon.com
- # Last Modified By : Manoj Srivastava
- # Last Modified On : Mon Feb 25 12:06:54 2002
- # Last Machine Used: glaurung.green-gryphon.com
- # Update Count : 2
- # Status : Unknown, Use with caution!
- # HISTORY :
- # Description :
- #
- #
-
- # make sure we exit on error
- set -e
-
- # set the version and revision
- progname="`basename \"$0\"`"
- pversion='$Revision: 1.1 $'
-
- ######################################################################
- ######## #########
- ######## Utility functions #########
- ######## #########
- ######################################################################
- setq() {
- # Variable Value Doc_string
- if [ "x$2" = "x" ]; then
- echo >&2 "$progname: Unable to determine $3"
- exit 1;
- else
- if [ "x$VERBOSE" != "x" ]; then
- echo "$progname: $3 is $2";
- fi
- eval "$1=\"\$2\"";
- fi
- }
-
- withecho () {
- echo " $@" >&2
- "$@"
- }
-
- usageversion () {
- cat >&2 <<END
- Debian GNU/Linux $progname $pversion.
- Copyright (C) 2002 Manoj Srivastava.
- This is free software; see the GNU General Public Licence for copying
- conditions. There is NO warranty.
-
- Usage: $progname [options] dest_file src_dir
- Options:
- -h, --help print this message
- -s foo, --src-dir foo Set the src dir (historical md5sums live here)
- -d [n], --debug [n] Set the Debug level to N
- -n, --no-action Dry run. No action is actually taken.
- -v, --verbose Make the script verbose
-
- By default, the directory the new_file lives in is assumed to be the src-dir,
- which is where we look for any historical md5sums.
-
- END
- }
-
- ######################################################################
- ######## #########
- ######## Command line args #########
- ######## #########
- ######################################################################
- #
- # Long term variables#
- #
- docmd='YES'
- action='withecho'
- DEBUG=0
- VERBOSE=''
- statedir='/var/lib/ucf';
-
-
- # Note that we use `"$@"' to let each command-line parameter expand to a
- # separate word. The quotes around `$@' are essential!
- # We need TEMP as the `eval set --' would nuke the return value of getopt.
- TEMP=`getopt -o hs:d:D::nv -n "$progname" \
- --long help,src-dir:,dest-dir:DEBUG::,no-action,verbose \
- -- "$@"`
-
- if [ $? != 0 ] ; then
- echo "Error handling options.Terminating..." >&2 ;
- exit 1 ;
- fi
-
- # Note the quotes around `$TEMP': they are essential!
- eval set -- "$TEMP"
-
- while true ; do
- case "$1" in
- -h|--help) usageversion; exit 0 ;;
- -n|--no-action) action='echo'; docmd='NO'; shift ;;
- -v|--verbose) VERBOSE=1; shift ;;
- -s|--src-dir)
- opt_source_dir="$2"; shift 2 ;;
- -d|--debug)
- # d has an optional argument. As we are in quoted mode,
- # an empty parameter will be generated if its optional
- # argument is not found.
- case "$2" in
- "") setq DEBUG 1 "The Debug value"; shift 2 ;;
- *) setq DEBUG "$2" "The Debug value"; shift 2 ;;
- esac ;;
- --) shift ; break ;;
- *) echo "Internal error!" ; exit 1 ;;
- esac
- done
-
- if [ $# != 2 ]; then
- echo >&2 "*** ERROR: Need exactly two arguments, got $#";
- echo >&2 ""
- usageversion;
- exit 0 ;
- fi
-
- setq dest_file "$1" "The Destination file";
- setq source_dir "$2" "The source directory";
-
-
- # Load site defaults and over rides.
- if [ -f /etc/ucf.conf ]; then
- . /etc/ucf.conf
- fi
-
- # Command line, env variable, config file, or default
- if [ "X$source_dir" = "X" ]; then
- if [ ! "x$opt_source_dir" = "x" ]; then
- setq source_dir "$opt_source_dir" "The Source directory"
- elif [ ! "x$UCF_SOURCE_DIR" = "x" ]; then
- setq source_dir "$UCF_SOURCE_DIR" "The Source directory"
- elif [ ! "x$conf_source_dir" = "x" ]; then
- setq source_dir "$conf_source_dir" "The Source directory"
- fi
- fi
-
- if [ ! -d "$source_dir" ]; then
- echo >&2 "The source dir does not exist. Stopping now."
- exit 2;
- fi
-
- if [ "X$dest_file" = "X" ]; then
- echo >&2 "Uknown file to search for. Stopping now."
- exit 2;
- fi
-
- old_mdsum_dir="$source_dir/"$(basename "${new_file}")".md5sum.d";
- old_mdsum_file="$source_dir/"$(basename "${new_file}")".md5sum";
-
-
- if [ -e "$statedir/hashfile" -a ! -r "$statedir/hashfile" ]; then
- echo >&2 "$progname: do not have read privilege to the state data"
- if [ "X$docmd" = "XYES" ]; then
- exit 1;
- fi
- fi
-
- # test and see if this file exists in the database
- if [ -e "$statedir/hashfile" ]; then
- if [ "X$VERBOSE" != "X" ]; then
- echo >&2 "The hash file exists";
- echo grep "[[:space:]]${dest_file}$" "$statedir/hashfile";
- grep "[[:space:]]${dest_file}$" "$statedir/hashfile" ;
- fi
- lastsum=$(grep "[[:space:]]${dest_file}$" "$statedir/hashfile" | \
- awk '{print $1;}' );
- fi
-
- if [ "X$lastsum" = "X" ]; then
- echo >&2 "$progname: No record of file in databse. Stopping now."
- exit 2;
- fi
-
- if [ $DEBUG -gt 0 ]; then
- cat <<EOF
- The new start file is \`$new_file\'
- The destination is \`$dest_file\'
- The history is kept under \'$source_dir\'
- EOF
- if [ -s "$dest_file" ]; then
- echo "The destination file exists, and has md5sum:"
- md5sum "$dest_file"
- else
- echo "The destination file does not exist."
- fi
- if [ "X$lastsum" != "X" ]; then
- echo "The old md5sum exists, and is:"
- echo $lastsum
- else
- echo "The old md5sum does not exist."
- fi
- if [ -e "$new_file" ]; then
- echo "The new file exists, and has md5sum:"
- md5sum "$new_file"
- else
- echo "The new file does not exist."
- fi
- if [ -d "$old_mdsum_dir" ]; then
- echo "The historical md5sum dir $old_mdsum_dir exists"
- elif [ -f "$old_mdsum_file" ]; then
- echo "The histotical md5sum file $old_mdsum_file exists"
- else
- echo "Historical md5sums are not available"
- fi
- fi
-
- if [ -d "$old_mdsum_dir" -o -f "$old_mdsum_file" ]; then
- if [ -d "$old_mdsum_dir" ]; then
- for file in ${old_mdsum_dir}/*; do
- oldsum=$(cat "$file" | awk '{print $1}');
- if [ "$oldsum" = "$destsum" ]; then
- # Bingo!
- echo $(cat "$file" | awk '{print $2}');
- exit 0;
- fi
- done
- elif [ -f "$old_mdsum_file" ]; then
- oldsum=$(grep "^${destsum}" "$old_mdsum_file")
- if [ "X$oldsum" != "X" ]; then
- # Bingo
- echo $(grep "^${destsum}" "$old_mdsum_file" | awk '{print $2}')
- exit 0;
- fi
- fi
- # Well, nothing matched. We now check to see if the
- # maintainer has an opinion on how to set the ``md5sum of the
- # previously installed version'', since we have no way of
- # determining that automatically. Please note that unless
- # there are limited number of previously released packages
- # (like just one), the maintainer is also making a guess at
- # this point by supplying a historical md5sum default file.
- if [ "X$VERBOSE" != "X" ]; then
- echo >&2 "Histotical md5sums did not match."
- fi
- if [ -d "$old_mdsum_dir" ]; then
- if [ -e "${old_mdsum_dir}/default" ]; then
- echo default;
- exit 0;
- fi
- elif [ -f "$old_mdsum_file" ]; then
- oldsum=$(grep "[[:space:]]default$" "$old_mdsum_file" | \
- awk '{print $1;}')
- if [ "X$oldsum" != "X" ]; then
- # Bingo
- echo default;
- exit 0;
- fi
- fi
- fi
-
-
- exit 0;
-